package cn.zkrt.iotms.module.iot.service.impl;

import cn.zkrt.iotms.module.iot.dao.DeviceAttributeBDao;
import cn.zkrt.iotms.module.iot.dao.DeviceTypeAttributeBDao;
import cn.zkrt.iotms.module.iot.dao.DeviceWtblAttributeRelationBDao;
import cn.zkrt.iotms.module.iot.dto.DeviceAttributeBDTO;
import cn.zkrt.iotms.module.iot.entity.DeviceAttributeB;
import cn.zkrt.iotms.module.iot.entity.DeviceTypeAttributeB;
import cn.zkrt.iotms.module.iot.entity.DeviceWtblAttributeRelationB;
import cn.zkrt.iotms.module.iot.service.DeviceAttributeBService;
import cn.zkrt.iotms.module.iot.vo.DeviceAttributeBVO;
import cn.zkrt.iotms.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * 设备属性表(DeviceAttributeB)表服务实现类
 *
 * @author xulinyu
 * @since 2024-09-29 11:02:36
 */
@Service("deviceAttributeBService")
public class DeviceAttributeBServiceImpl extends ServiceImpl<DeviceAttributeBDao,DeviceAttributeB> implements DeviceAttributeBService {

    private DeviceAttributeBDao deviceAttributeBDao;

    private final DeviceTypeAttributeBDao deviceTypeAttributeBDao;

    private final DeviceWtblAttributeRelationBDao deviceWtblAttributeRelationBDao;

    public DeviceAttributeBServiceImpl(DeviceAttributeBDao deviceAttributeBDao, DeviceTypeAttributeBDao deviceTypeAttributeBDao, DeviceWtblAttributeRelationBDao deviceWtblAttributeRelationBDao) {
        this.deviceAttributeBDao = deviceAttributeBDao;
        this.deviceTypeAttributeBDao = deviceTypeAttributeBDao;
        this.deviceWtblAttributeRelationBDao = deviceWtblAttributeRelationBDao;
    }


    @Override
    public Boolean add(DeviceAttributeBDTO dto) {
        //创建设备类型属性
        DeviceTypeAttributeB attr = new DeviceTypeAttributeB();
        attr.setTypeAttributeKey(dto.getTypeAttributeKey());
        attr.setTypeAttributeName(dto.getTypeAttributeName());
        attr.setDeviceFrom(dto.getDeviceFrom());
        deviceTypeAttributeBDao.insert(attr);

        //关联到设备属性
        DeviceAttributeB deviceAttributeB = new DeviceAttributeB();
        deviceAttributeB.setDeviceId(dto.getDeviceId());
        deviceAttributeB.setTypeAttributeId(attr.getId());
        return this.save(deviceAttributeB);
    }

    @Override
    public Boolean edit(DeviceAttributeBDTO dto) {
        //如果是自定义的设备类型属性可以修改
        //自定义的设备类型属性没有deviceTypeId
        DeviceTypeAttributeB deviceTypeAttributeB = deviceTypeAttributeBDao.selectById(dto.getTypeAttributeId());
        if(Objects.nonNull(deviceTypeAttributeB)){
            if(StringUtils.isEmpty(deviceTypeAttributeB.getDeviceTypeId())){
                DeviceTypeAttributeB typeAttributeB = new DeviceTypeAttributeB();
                typeAttributeB.setTypeAttributeName(dto.getTypeAttributeName());
                typeAttributeB.setTypeAttributeKey(dto.getTypeAttributeKey());
                typeAttributeB.setId(dto.getTypeAttributeId());
                typeAttributeB.setDeviceFrom(dto.getDeviceFrom());
                deviceTypeAttributeBDao.updateById(typeAttributeB);
            }
        }
        return true;
    }

    @Override
    public DeviceAttributeBVO queryById(String id) {
        return deviceAttributeBDao.queryById(id);
    }

    @Override
    public Page<DeviceAttributeBVO> queryByPage(Page<DeviceAttributeB> page, String typeAttributeName, String deviceName) {
        return deviceAttributeBDao.queryByPage(page,typeAttributeName,deviceName);
    }

    @Override
    public Boolean deleteByIds(List<Long> idList) {
        //绑定了物通博联属性的设备属性不能删除
        LambdaQueryWrapper<DeviceWtblAttributeRelationB> w1 = new LambdaQueryWrapper<>();
        w1.in(DeviceWtblAttributeRelationB::getDeviceAttributeId, idList);
        Integer count = deviceWtblAttributeRelationBDao.selectCount(w1);
        if(count > 0) {
            throw new RuntimeException("请解除物联网属性关联");
        }
        return this.removeByIds(idList);
    }

    @Override
    public List<DeviceAttributeBVO> queryByDeviceId(String deviceId) {
        return deviceAttributeBDao.queryByDeviceId(deviceId);
    }
}
